import json
import time
from redis import Redis
from pymongo import MongoClient
from pymongo.errors import PyMongoError


def main():
    try:
        # 创建Redis连接
        redis_client = Redis(
            host='127.0.0.1',
            port=6379,
            socket_connect_timeout=5  # 连接超时时间（秒）
        )
        print("✅ Redis连接成功")

        # 创建MongoDB连接
        mongo_client = MongoClient(
            host='localhost',
            port=27017,
            serverSelectionTimeoutMS=5000
        )
        mongo_client.admin.command('ping')  # 测试MongoDB连接是否正常
        print("✅ MongoDB连接成功")

        # 选择数据库和集合
        db = mongo_client.baiduNovel
        collection = db.baiduFanRen
        print(f"📁 正在使用集合: {collection.full_name}")

        # 打印当前集合中的文档数量（初始状态）
        initial_count = collection.count_documents({})
        print(f"📊 集合初始文档数量: {initial_count}")

        while True:  # 进入无限循环，持续从Redis获取数据
            try:
                timestamp = time.strftime("%Y-%m-%d %H:%M:%S")  # 获取当前时间戳，用于日志记录
                print(f"\n[{timestamp}] 等待从Redis获取数据...")

                # 从Redis中获取数据
                result = redis_client.blpop(['baiduFanRen:items'], timeout=30)  # 从Redis列表的左侧弹出元素，设置超时时间为30秒

                if result is None:
                    print(f"[{timestamp}] ⏳ Redis超时，未获取到数据")
                    continue

                source, data = result  # 解构获取到的结果，获取数据来源和具体数据
                source_str = source.decode()  # 将来源字节串解码为字符串
                print(f"[{timestamp}] 📥 从Redis获取数据，来源: {source_str}")
                print(f"[{timestamp}] 原始数据长度: {len(data)} bytes")
                print(f"[{timestamp}] 原始数据前100字符: {data[:100].decode('utf-8', errors='replace')}")

                if not data:
                    print(f"[{timestamp}] ⚠️ 获取到空数据，跳过")
                    continue

                # 解析JSON数据
                try:
                    change_data = json.loads(data)  # 尝试将JSON格式的数据转换为Python字典
                    print(f"[{timestamp}] 🧩 成功解析JSON数据")
                    print(f"[{timestamp}] 解析后的数据类型: {type(change_data)}")
                    print(f"[{timestamp}] 数据包含的键: {list(change_data.keys())[:5]}...")  # 只显示前5个键
                except json.JSONDecodeError as e:
                    print(f"[{timestamp}] ❌ JSON解析失败: {str(e)}")
                    print(f"[{timestamp}] 错误数据: {data[:200].decode('utf-8', errors='replace')}")
                    continue

                # 检查数据是否有效
                if not isinstance(change_data, dict) or len(change_data) == 0:
                    print(f"[{timestamp}] ❌ 无效的数据格式，不是非空字典")
                    continue

                # 写入MongoDB
                try:
                    insert_result = collection.insert_one(change_data)
                    # 验证写入结果
                    inserted_doc = collection.find_one({"_id": insert_result.inserted_id})
                    if inserted_doc:
                        print(f"[{timestamp}] ✅ 数据写入成功，ID: {insert_result.inserted_id}")
                        print(f"[{timestamp}] 写入的数据包含 {len(inserted_doc)} 个字段")
                        print(f"[{timestamp}] 当前集合文档总数: {collection.count_documents({})}")
                    else:
                        print(f"[{timestamp}] ❌ 写入验证失败，未找到刚插入的文档")
                except PyMongoError as e:  # 捕获MongoDB特定的异常
                    print(f"[{timestamp}] ❌ MongoDB写入失败: {str(e)}")
                    print(f"[{timestamp}] 失败的数据预览: {str(change_data)[:200]}")
                    continue

            except Exception as e:
                print(f"[{timestamp}] ❌ 处理数据时出错: {str(e)}")
                # 打印完整的异常堆栈信息，方便调试
                import traceback  # 导入traceback模块，用于打印异常堆栈信息
                traceback.print_exc()  # 打印当前异常的完整堆栈跟踪信息，便于调试
                continue

    except Exception as e:  # 捕获所有异常
        print(f"❌ 初始化连接失败: {str(e)}")
        import traceback
        traceback.print_exc()
        return
